package com.yeban.javase.day09.test;

import java.util.*;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/10/17
 *
 *  2.去除ArrayList集合中重复元素
 *  1>.存入字符串元素
 *  2>.存入自定义对象元素（如Person对象）
 */
public class test02 {

    public static void main(String[] args) {

        // 1>.存入字符串元素
        ArrayList<String> strs = new ArrayList<>();
        strs.add("abc");
        strs.add("def");
        strs.add("ghi");
        strs.add("def");
        strs.add("abc");

        System.out.println("去重前：" + strs);
        ArrayList<String> newStrs1 = removeRepeat3(strs);
        System.out.println("去重后：" + newStrs1);
        // strs.stream().forEach(System.out::println);

        // 2>.存入自定义对象元素（如Person对象）
        ArrayList<Person> persons = new ArrayList<Person>();
        persons.add(new Person("张三",18));
        persons.add(new Person("李四",19));
        persons.add(new Person("王五",17));
        persons.add(new Person("赵六",18));
        persons.add(new Person("张三",18));
        persons.add(new Person("孙七",18));

        System.out.println("去重前：" + persons);
        ArrayList<Person> newList = removeDuplicate(persons);
        System.out.println("去重后：" + newList);
    }

    // 针对当前集合进行添加元素的操作
    public static ArrayList<String> removeRepeat3(ArrayList<String> strs) {
        Iterator<String> iterator1 = strs.iterator();
        // 外层迭代器，用于逐个取出集合中的元素,遍历整个 list 集合。
        while(iterator1.hasNext()) {
            // 内层迭代器 对每个由外层迭代器取出的 current 元素，统计其在整个集合中出现的次数
            String s = iterator1.next();
            Iterator<String> iterator2 = strs.iterator();
            int count = 0;
            while(iterator2.hasNext()) {
                if(s.equals(iterator2.next())) {
                    count++;
                }
            }
            if(count > 1) {
                iterator1.remove();
            }
        }
        return strs;
    }

    // 将结果放到新数组中
    public static ArrayList<String> removeRepeat1(ArrayList<String> strs) {
        ArrayList<String> list = new ArrayList<>();
        // 取出每一个要比对的元素
        for(String str : strs) {
            boolean flag = false;
            // 比对新数组中的元素
            for(String s : list) {
                if(s.equals(str)) {
                    flag = true;
                    break;
                }
            }
            // 如果存在添加到result中
            if(!flag) {
                list.add(str);
            }
        }
        return list;
    }

    // 在原有的数组上进行移除重复元素
    public static ArrayList<Person> removeDuplicate(ArrayList<Person> persons) {
        // 外层循环从后往前遍历
        for (int i= persons.size() - 1; i >= 0; i --) {
            Person p1 = persons.get(i);

            // 内层循环从前往后遍历
            for(int j = i - 1; j >= 0; j --) {
                Person p2 = persons.get(j);
                if(p1.equals(p2)) {
                    persons.remove(j);
                    break;
                }
            }
        }
        return persons;
    }
}

class Person{
    String name;
    int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Person{name = " + name + ", age = " + age + "}";
    }
}
